from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings

class FastDFSStorage(Storage):
    """自定义文件管理系统类 """

    def __init__(self, client_conf=None, base_url=None):
        """初始化方法"""
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_BASE_URL


    def _open(self, name, mode='rb'):
        """
        储存类用于打开文件的，因为我们制作上传文件不打开文件，所以此方法重写后什么也不做
        :param name: 要打开的文件名
        :param mode: 文件读取模式 read bytes
        :return: None
        """
        pass

    def _save(self, name, content):
        """
        让Django把图片用Fdfs进行图片的上传存储
        :param name: 要存储的文件名
        :param content: 要存储的文件对象
        :return: file_id
        """
        client = Fdfs_client(settings.FDFS_CLIENT_CONF)

        #下面这种上床方式需要知道当前文件的本地路径
        #ret = client.upload_by_filename('/home/python/Desktop/01.jpg')  此方法会在上传后的storage中的文件名会有后缀名
        ret = client.upload_by_buffer(content.read())  #此方法上传的文件没有后缀名

        #判断文件是否上传成功
        status = ret.get('Status')

        if status != 'Upload successed.':
            return Exception('Upload file failed') #文件上传失败

        #文件上传成功，取出文件保存地址
        file_id = ret.get('Remote file_id')
        return file_id



        """{'Group name': 'group1',
            'Local file name': '/home/python/Desktop/01.jpg',
            'Remote file_id': 'group1/M00/00/02/wKgOgl9t-DWAFcACAAvc_jJa4hE760.jpg',
            'Status': 'Upload successed.',
            'Storage IP': '192.168.14.130',
            'Uploaded size': '759.00KB'}
            """

    def exists(self, name):
        """
        判断要上传的文件在storage服务器中是否以存在
        :param name: 上传的文件名
        :return: True(文件已存在，就不会再上传了) False(文件不存咋，需要上传，马上调用save)
        """
        return False


    def url(self, name):
        """
        返回要下载文件的绝对路径
        :param name: file_id  文件在storage中的路径（在storage中的绝对路径）
        :return: 文件的绝对路径  http://192.168.14.130:8888/group1/M00/00/02/wKgOgl9t-DWAFcACAAvc_jJa4hE760.jpg
        """
        return settings.FDFS_BASE_URL + name